package com.fjw.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一响应结果封装类
 * 用于标准化API接口返回格式，支持泛型数据类型
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
    /**
     * 业务状态码
     * 预定义值：
     * 0-操作成功
     * 1-操作失败（通用错误）
     * 400-参数校验失败
     * 401-未登录认证
     * 403-权限不足
     * 500-服务器内部错误
     */
    private Integer code;

    /**
     * 响应提示信息
     * 示例："操作成功"、"参数格式不正确"
     */
    private String message;

    /**
     * 响应数据体
     * 泛型支持任意类型数据返回
     */
    private T data;

    // --------------- 静态工厂方法 ---------------

    /**
     * 快速构建成功响应（带数据）
     * @param data 响应数据
     * @param <E> 数据类型
     * @return 标准化响应结果
     */
    public static <E> Result<E> success(E data) {
        return new Result<>(0, "操作成功", data);
    }

    /**
     * 快速构建成功响应（无数据）
     * @return 标准化响应结果
     */
    public static Result<?> success() {
        return new Result<>(0, "操作成功", null);
    }

    /**
     * 快速构建失败响应（自定义错误信息）
     * @param message 错误提示信息
     * @return 标准化响应结果
     */
    public static Result<?> error(String message) {
        return new Result<>(1, message, null);
    }

    /**
     * 快速构建失败响应（自定义状态码和错误信息）
     * @param code 业务状态码
     * @param message 错误提示信息
     * @return 标准化响应结果
     */
    public static Result<?> error(Integer code, String message) {
        return new Result<>(code, message, null);
    }

    // --------------- 链式调用方法 ---------------

    /**
     * 链式设置状态码
     * @param code 业务状态码
     * @return 当前Result实例
     */
    public Result<T> code(Integer code) {
        this.code = code;
        return this;
    }

    /**
     * 链式设置提示信息
     * @param message 提示信息
     * @return 当前Result实例
     */
    public Result<T> message(String message) {
        this.message = message;
        return this;
    }

    /**
     * 链式设置响应数据
     * @param data 响应数据
     * @return 当前Result实例
     */
    public Result<T> data(T data) {
        this.data = data;
        return this;
    }
}
